#ifndef _RFID_APP_H_
#define _RFID_APP_H_

#include <stdint.h>
#include <stdbool.h>
#include "rfid_board.h"
#include "config.h"

#if _RFID_FUNCTION_ENABLE_
/* 定义卡片目录 */
// 主目录
#define CPU_CARD_MAIN_DIRECTORY                             (0x3F00)
// 用户目录
#define CPU_BINARY_FILE_DIRECTORY                           (0x0003)
/* 定义目录名称 */
// 用户卡目录 - 杨格
#define YG_CPU_USER_DIRECTOR_NAME                           "YGS_USER_PROFILE"
// 用户卡目录 - 华住
#define HZ_CPU_USER_DIRECTOR_NAME                           "H_WORLD_GROUP_01"

// 芯片复位等待稳定时间
#define RFID_CHIP_REBOOT_WAIT_READY_TIME                    (10ul)
// 扇区操作间隔时间
#define RFID_SECTOR_OPERATION_INTERVAL                      (20ul)

// 重复读卡次数
#define RFID_REPEAT_READ_CARD_TIMES                         (3ul)
// 重复读卡间隔时间
#define RFID_REPEAT_READ_CARD_INTERVAL                      (100ul)

// 天线校准次数
#define RFID_ANTENNA_CALIBRATION_COUNT                      (4ul)
// 获取天线电压间隔时间 - 10ms
#define RFID_GET_ANT_VOLT_INTERVAL                          (10ul)
// 等待天线稳定时间    - 30us
#define RFID_WAIT_ANT_STABLE_TIME                           (30ul)
// 读卡卡数据间隔时间  - 10ms
#define RFID_READ_CARD_DATA_INTERVAL                        (10ul)

// 最小读卡电压
#define RFID_MIX_READ_CARD_SENSITIVITY                      (150ul)
// 卡靠近衰减电压
#define RFID_CARD_NEAR_ATTENUATION_VOLTAGE                  (20ul)

/**
 * @brief 自检步骤
 *
 */
typedef enum
{
  RFID_SELF_TEST_IDLE,              // 空闲
  RFID_CONNECTION_TEST,             // 连接测试
  RFID_GET_ATCIVE_ANTENNA_VOLTAGE,  // 获取活跃时天线电压
  RFID_GET_DEFAULT_ANTENNA_VOLTAGE, // 获取默认情况下天线电压
} RfidSelfTestStep_t;

/**
 * @brief 卡片操作步骤
 * 
 */
typedef enum
{
  CARD_STEP_START,            // 启动
  CARD_STEP_ERROR,            // 错误
  CARD_STEP_RETRY,            // 重试
  CARD_STEP_SUCCESS,          // 成功
  CARD_STEP_MODIFY_KEY,       // 修改密钥
  CARD_STEP_DATA_INIT,        // 数据初始化
  CARD_VERIFY_BY_COMPARING,   // 比对数据一致性
  CARD_WRITE_DATA_TO_SECTOR,  // 将数据写入到扇区
  CARD_STEP_VERIFY_USER_KEY,  // 验证密钥A
  CARD_STEP_VERIFY_INIT_KEY,  // 验证初始化密钥
  CARD_READ_DATA_FROM_SECTOR, // 从扇区读取数据
} CardExecuteStep_t;

/**
 * @brief 命令执行结果
 *
 */
typedef enum
{
  CARD_EXECUTE_ERROR,         // 执行失败
  CARD_NOT_SUPPORTED,         // 不支持
  CARD_DOES_NOT_EXIST,        // 卡片不存在
  CARD_EXECUTE_SUCCESS,       // 执行完毕
  CARD_EVENT_PROCESSING,      // 事件正在处理
  CARD_COMMUNICATION_FAILURE, // 通讯失败
  CARD_INSUFFCIENT_AUTHORITY, // 权限不足
} RfidExecuteResult_t;

/**
 * @brief 系统状态
 *
 */
typedef struct
{
  uint8_t BusyEn          : 1; // 繁忙标识
  uint8_t WaitCardRelease : 1; // 等待卡片释放
  uint8_t Reserved        : 6; // 保留

  uint8_t ValidTimes;                                      // 有效次数
  uint16_t ActiveAntennaVoltage;                           // 活跃时天线参数
  uint16_t DefaultAntennaVoltage;                          // 默认时天线参数
  uint16_t AntennaVoltage[RFID_ANTENNA_CALIBRATION_COUNT]; // 采样电压
} RfidSystemParameter_t;

/**
 * @brief 扇区参数
 *
 */
typedef struct
{
  uint8_t RWBlockId;                                           // 当前操作块
  uint8_t RWSectorId;                                          // 当前操作扇区
  uint16_t RWDataSize;                                         // 已操作的数据长度
  uint8_t ExecuteStep;                                         // 命令执行步骤
  uint16_t TotalDatLength;                                     // 数据总长度
  uint8_t KeyValueA[RFID_MAX_NUMBER_OF_CODED_TEXT];            // 用户密钥A
  uint8_t KeyValueB[RFID_MAX_NUMBER_OF_CODED_TEXT];            // 用户密钥B
  uint8_t SectorDataBuff[RFID_MAX_LENGTH_OF_OPERATION_DATA];   // 扇区操作数据
  uint8_t CardSerialNumber[RFID_NUMBER_OF_CARD_SERIAL_NUMBER]; // 卡片序列号
} RfidSectorParameter_t;

/**
 * @brief 状态位
 *
 */
typedef struct
{
  RfidSelfTestStep_t SelfTestStep;       // 自检步骤
  RfidSystemParameter_t SystemParameter; // 系统参数
  RfidSectorParameter_t SectorParameter; // 扇区参数
} RfidStatusBit_t;
#endif

/**
 * @brief 使能卡片检测功能
 * 
 */
extern void RfidEnableCardDecetionFunction(void);

/**
 * @brief 禁用卡片检测功能
 * 
 */
extern void RfidDisableCardDecetionFunction(void);

/**
 * @brief 启动 rfid 设备自检
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool RfidStartDeviceSelfTestTask(void);

/**
 * @brief 启动读取卡片数据
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool RfidStartReadCardDataTask(void);

/**
 * @brief 启动本地注册用户
 * 
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool RfidStartLocalRegisterUserTask(void);

/**
 * @brief 退出当前任务
 *
 */
extern void RfidExitCurrectTask(void);

/**
 * @brief 初始化相关功能
 * 
 */
extern void RfidConfiguration(void);

#endif
